<<<предыдущая глава к содержанию следующая глава >>>

8. Анализ и обработка данных

8.1. Обработка статистических данных
8.2. Численное дифференцирование
8.3. Аппроксимация и интерполяция
8.4. Численное интегрирование
8.5. Нули и экстремумы функций
8.6. Обыкновенные дифференциальные уравнения

8.1 Обработка статистических данных

Никакой анализ статистических данных не может обойтись без предварительной их обработки:

max (A) , min(A) - поиск экстремальных элементов по столбцам массива А;

max(A,B) , min(A,B) - формирование массива с элементами, равными экстремальным из соответствующих элементов массивов;

max(A,[ ],dim) , min(A,[ ],dim) - вектор экстремальных элементов по измерению dim;

[C,I]=max(...) , [C,I]=min(...) - дополнительно выводится строка индексов экстремальных элементов;

median(X) , median (X,dim) - медианы массива;

mean(X) , mean (X,dim) -средние значения;

std(X) , std(X,flag) , std(X,flag,dim) - стандартное отклонение (flag=0 -несмещенная оценка s ; flag=1 - смещенная оценка s):

несмещенная оценка ; смещенная оценка ;

cov(X, Y) , cov(X,Y, flag) - ковариация для для массивов Х и Y (каждый столбец - переменная, строка - наблюдение)

, f=n или n-1;

cov(X) , cov(X,flag) - ковариация для столбцов массива Х ;

corrcoef (X) , corrcoef (X,Y) -коэффициенты корреляции:

.

8.2. Численное дифференцирование

Как известно, численное дифференцирование строится на использовании аппарата конечных разностей и соответствующего многообразия аппроксимаций. Здесь полезны функции:

diff(X), diff(X, n), diff(X, n, dim) - вычисление конечных разностей (первых, n-го порядка или по указанному измерению); если Х -массив, берутся разности между столбцами:
>> F= [ 0 0.0998 0.1987 0.2955 0.3894 0.4794]
>> D=diff(F)
D = 0.0998 0.0988 0.0969 0.0939 0.0900
>> D2=diff(F,2)
D2 = -0.0010 -0.0020 -0.0030 -0.0039

Для задач оптимизации градиентными методами полезны функции:

gradient(F), gradient(F,h), gradient(F,h1,h2,...) -приближенная оценка градиента функции n переменных с автоматическим выбором шага или с указанным шагом (одинаковым или разным по переменным):
>> [x,y]=meshgrid(-2:0.2:2, -2:0.2:2); % выбор сетки узлов
>> z=x.*exp(-x.^2-y.^2); % вычисление значений на сетке
>> [px,py]=gradient(z,.2,.2); % поиск градиента в узлах сетки
>> contour(z), hold on,quiver(px,py), hold off % рис.8.1
Рис.8.1
Рис.8.1.
Рис.8.2
Рис.8.2.

8.3. Аппроксимация и интерполяция

polifit(X,Y,n) - аппроксимация функции Y=Y(X) полиномом n-й степени:
>> X=0:0.1:0.5;
>> F=X.*sin(X);
>> P=polyfit(X,F,1)
P = 0.4814 -0.0314 % P(x)= 0.4814 x -0.0314
>> FF=polyval(P,X)
FF = -0.0314 0.0168 0.0649 0.1130 0.1612 0.2093
>> plot(X,F,'ob', X,FF,'-g'),grid,axis([0 0.5 -0.05 0.25]) % рис.8.2

interpft(Y,n,dim) -аппроксимация периодической функции на основе быстрого преобразования Фурье (Y - одномерный массив значений функции;
Рис.8.3
Рис.8.3.
n - число узлов в массиве значений):
>> X=0:10;
>> Y=sin(X).^2.*exp(-0.1.*X);
>> YP=interpft(Y,21);
>> xp=0:0.5:10;
>> plot(X,Y,'ob', xp,YP) % Рис. 8.3
Заметим, что в библиотеке имеется богатый ассортимент средств для преобразования Фурье.

spline(X,Y,Z) - интерполяция Y=Y(X) кубическим сплайном и вывод соответствующих значений в точках Z. Для получения большей информации используется конструкция pp=spline(X,Y): здесь командой V=ppval(pp,Z) можно найти значения в точках Z, a командой [Xs, Coef, m,L]=unmkpp(pp) получить данные о векторе разбиений аргумента Xs, коэффициентах Coef, m=length(Xs), L=length(Coef)/m .

interp1(X,Y,Z), interp1(X,Y,Z,'method') - одномерная табличная интерполяция (если Y двумерный массив, интерполяция ведется по каждому столбцу; значения Z должны входить в диапазон значений Х). Можно указать метод интерполяции - кусочно-линейной (linear, по умолчанию), ступенчатой (nearest), кубической (cubic), кубическими сплайнами (spline). Функция interp1q(X,Y,Z) реализует быструю линейную интерполяцию на неравномерной сетке.

interp2(X1,X2,Y,Z1,Z2), interp1(X1,X2,Y,Z1,Z2,'method') - двумерная табличная интерполяция Y=Y(X1,X2), аргументы должны меняться монотонно и заданы в формате функции meshgrid.

Рис.8.4
Рис.8.4.

>> [X1,X2]=meshgrid(-1:0.1:1);
>> Y=exp(-X1.^2-X2.^2).*(1+X1+X2);
>> [Z1,Z2]=meshgrid(-1:0.05:1);
>> Y2=interp2(X1,X2,Y,Z1,Z2);
>> mesh(X1,X2,Y),hold on,mesh(Z1,Z2,Y2+2),hold off % Рис. 8.4

interp3(X1,X2,X3,Y,Z1,Z2,Z3), interp3(..., 'method') - трехмерная табличная интерполяция Y=Y(X1,X2,X3);

interpn(X1,X2,...,Y,Z1,Z2,...), interp3(..., 'method') - многомер-ная табличная интерполяция Y=Y(X1,X2,...);

griddata(X1,X2,Y,Z1,Z2), griddata(X1,X2,Y,Z1,Z2, 'method') - двумерная табличная интерполяция на неравномерной сетке.

8.4. Численное интегрирование

polyarea (X,Y), polyarea (X,Y, dim) -площадь многоугольника с координатами вершин (X,Y):
>> polyarea ([1 2 3 4 5],[0 3 6 3 0])
ans = 12

trapz(X,Y), trapz(X,Y, dim) - вычисление интеграла по формуле трапеций ; функции cumtrapz(X,Y), cumtrapz(X,Y, dim) вычисляют к тому же промежуточные результаты;

quad('имя', a,b), quad('имя', a,b, eps), quad('имя', a,b, eps, trace), quad('имя', a,b, eps, trace,P1,P2,...), quad8(...) - вычисление определенного интеграла: a,b - пределы интегрирования; eps - относительная погрешность (по умолчанию 10-3); trace -построение точечного графика функции; 'имя' - имя подинтегральной функции (встроенной или М-файла); P1,P2,... - передаваемые параметры функции; quad использует квадратуру Симпсона, quad8 - Ньютона-Котеса 8-го порядка). Используется рекурсия до глубины 10 и может появиться сообщение - подозрение о сингулярности функции (наличии особенностей).
	function f=integr(x)                   
		f=x.*exp(-x);
>>quad('integr',0,2, 1e-5,1)
ans = 0.5940

dblquad('имя', a1,b1, a2,b2), dblquad('имя', a1,b1, a2,b2, eps), dblquad('имя', a1,b1, a2,b2, eps, <метод>) - вычисление двойного интеграла от функции <имя>(Х1,X2) ; <метод> - quad или quad8.

Рис.8.5
Рис.8.5.

8.5.Нули и экстремумы функций

Как известно, решение уравнений и поиск экстремумов функций - родственные задачи. Так решение системы fi(X)=0, i=1,...,n можно заменить поиском минимума , заведомо равного нулю, если система имеет решение. С другой стороны, поиск экстремумов функции можно свести к решению системы уравнений относительно нулевых значений ее производных.

Для некоторых классов функций имеются вполне универсаль-ные методы решения: так для полиномов поиск корней реализуется без каких-то условий обобщенным методом Ньютона - функцией roots(...) . В общем случае при великом многообразии методов реше-ние подобных задач отнюдь нетроивиально. В системе реализованы функции лишь для простейших задач без гарантий получения реше-ния.

xmin=fmin('имя',a,b), xmin=fmin('имя',a,b,<опции>), xmin= fmin ('имя', a,b,<опции>, p1,...,p10), [xmin,options]=fmin(...) - поиск минимума функции одной переменной на интервале [a,b]; в списке <опции> можно указать option(1)=1 (вывод промежуточных результатов), option(2)- погрешность итераций для аргумента (разница между смежными приближениями; по умолчанию 10-4) и option(14)- максимальное число итераций (по умолчанию 500). Используется метод золотого сечения и параболической интерполяции.
function r=m1(x)
r=x^2-x-3;
>> xm=fmin('m1',-2,3,[1, 1e-6])
Funcevals x f(x) Procedure
1 -0.0901699 -2.9017 initial
2 1.09017 -2.9017 golden
3 1.81966 -1.5085 golden
4 0.5 -3.25 parabolic
5 0.5 -3.25 parabolic
6 0.5 -3.25 parabolic
xm =
0.5000

xmin=fmins('имя',x0), xmin=fmins('имя',x0,<опции>), xmin= fmins ('имя', x0,<опции> или [], p1,...,p10), [xmin,options]=fmins(...) - поиск минимума функции нескольких переменных: x0 - начальное приближение; p1,...,p10 - дополнительные параметры; в списке <опции> можно указать option(1)=1 (вывод промежуточных результа-тов), option(2)- погрешность итераций для аргумента (разница между смежными приближениями; по умолчанию 10-4), option(3)-итерационная погрешность для функции и option(14)- максимальное число итераций (по умолчанию 200 x n). [xmin,opt]=fmins('m2',[0.5 2.5])
function r=m2(x)
r=(x(1)-1)^2+(x(2)-3)^2;
>>
xmin =
1.0000 3.0000
opt =
0 0.0001 0.0001 0.0000 0 0 0 0.0000 0
72 0 0 0 400 0 0.0000 0.1000 0

(возвращаемые здесь опции 8 и 10 определяют минимум функции и число итераций). Используется метод Нелдера-Мида (строится симплекс из n+1 вершины в n-мерном пространстве, берется новая точка внутри или вблизи симплекса и может заменить одну из вершин; процесс повторяется до малого диаметра симплекса).

fzero('имя',x0), fzero('имя',x0,eps), fzero ('имя', x0, eps , trace), fzero ('имя', x0, eps, trace,p1,...,p10) - поиск действительных корней функции одной переменной при начальном приближении х0 (можно взять и в форме [a,b] при условии f(a) x f(b) < 0) с заданной относительной погрешностью; trace=1 - вывод промежуточных результатов. Используется метод дихотомии, хорд и обратной квадратической интерполяции. При поиске корней полинома см.roots.

Процесс поиска корня виден из примера:
>>> fzero('sin',6,[],1)
Func evals x f(x) Procedure
1 6 -0.279415 initial
2 5.83029 -0.437567 search
3 6.16971 -0.113236 search
4 5.76 -0.499642 search
5 6.24 -0.0431719 search
6 5.66059 -0.583146 search
7 6.33941 0.0561963 search
Looking for a zero in the interval [5.6606, 6.3394]
8 6.27974 -0.00344052 interpolation
9 6.28319 1.70244e-006 interpolation
10 6.28319 -3.35667e-012 interpolation
11 6.28319 -2.44921e-016 interpolation
12 6.28319 2.41961e-015 interpolation
ans = 6.28318530717959
>> 2*pi
ans = 6.28318530717959

Заметим, что в случае двух переменных существенную помощь для выбора начального приближения может оказать функция gradient (cм. 8.2) и contour(...), которая будет рассмотрена при ознакомлении с функциями графики.

8.6. Обыкновенные дифференциальные уравнения

В системе MatLab предусмотрены специальные средства решения задачи Коши для системобыкновенных дифференциальных уравнений, заданных как в явной форме = F(t,x) , так и в неявной M=F(t,x), где М- матрица, - т.н. решатель ОДУ (solver ODE), обеспечивающий пользователю возможность выбора метода, задания начальных условий и др.

В простейшем варианте достаточно воспользоваться командой [T,X]=solver('F', [DT], X0, ...), где DT - диапазон интегрирования, X0 - вектор начальных значений, F - имя функции вычисления правых частей системы, solver - имя используемой функции (ode45 - метод Рунге-Кутта 4 и 5-го порядков, ode23 - тот же метод 2 и 3-го поряд-ков, ode113 - метод Адамса - для нежестких систем, ode23s, ode15s - для жестких систем и др.). Версии решателя различаются используемыми методами (по умолчанию относительная погрешность 10-3 и абсолютная 10-6) и соответственно временем и успешностью решения. Под жесткостью здесь понимается повышенное требование к точности - использование минимального шага во всей области интегрирования. При отсутствии информации о жесткости рекомендуется попытаться получить решение посредством ode45 и затем ode15s. Если диапазон DT задан начальным и конечным значением [to , tk], то количество элементов в массиве Т (и в массиве решений Х) определяется необходимым для обеспечения точности шагом; при задании DT в виде [to , t1, t2, ... , tk] или [to :Dt: tk] - указанными значениями.

Например, в простейшем варианте решение уравнения =tЧe-t в интервале t О[0, 0.5] с начальным условием x(t=0)=1 :
function f =odu1(t,x)
f=t*exp(-t);
>> [T,X]=ode45 ('odu1', [0, 0.5], 1)
T = 0 0.0125 0.0250 0.0375 0.0500 0.0625 0.0750 0.0875
0.1000 0.1125 0.1250 0.1375 0.1500 0.1625 0.1750
X = 1.0000 1.0000 1.0003 1.0006 1.0012 1.0018 1.0027 1.0036
1.0046 1.0058 1.0072 1.0086 1.0102 1.0118 1.0136 ….

Для иллюстрации решения системы и ряда нестандартных возможностей рассмотрим задачу выравнивания цен по уровню актива в следующей постановке.

Предположим, что изменение уровня актива у пропорционально разности между предложением s и спросом р, т.е. y'=k(s-d), k>0, и что изменение цены z пропорционально отклонению актива у от некоторого уровня y0, т.е. z'=-m(y-y0), m>0. Естественно, что предложение и спрос зависят от цены, например, s(z)=az+s0, d(z)= d0 - cz. Соответственно возникает система дифференциальных уравнений

y' = kЧ(s(z)-d(z))
z' = - mЧ (y-y0) .

Вычисление правых частей оформляем функцией:

	function f=odu2(t,X)                   
		y=X(1);   	z=X(2);
		a=20; c=10;	s0=10; d0=50; k=0.3; m=0.1;
		s=a*z+s0; d= d0-c*z;    y0=19;
		f(1)=k*(s-d) ; f(2)=-m*(y-y0); 
		f=f';              % вектор-столбец

Если выполнить решение при y0= 19, z0=2

		>> [T,Y]=ode45('odu2', [0:0.3:9],[19 2]); 
		>> [T Y]
        	>> plot(T,Y)
будет выведена таблица значений искомых функций:
    ans =		0   19.0000   2.0000
		  0.3000  20.7757   1.9731
	        0.6000  22.4101   1.8949
              0.9000  23.7686   1.7714
              1.2000  24.7427   1.6126
              1.5000  25.2569   1.4313 ...
и их графики (рис. 8.6).

Эта система уравнений относится к числу т.н. автономных (или динамических), ибо независимая переменная в нее явно не входит; соответственно может быть установлена связь между найденными решениями: в параметрическом задании линия y=y(t), z=z(t) определяет фазовую кривую (траекторию) системы - гладкую кривую без самопересечений, замкнутую кривую или точку, которая позволяет судить об устойчивости системы.

Так, установив опции к построению двумерного фазового портрета (функция odephas2)и номера переменных состояния :
>> opt=odeset('OutputSel',[1 2], 'OutputFcn','odephas2');
>> [T,Y]=ode45('odu2', [0:0.3:9],[19 2],opt);
получаем фазовый портрет системы, свидетельствующий о ее устойчивости - гармонии между активом и ценами (рис.8.7).
Рис.8.6
Рис.8.6
Рис.8.7
Рис.8.7

В качестве другого примера подобных задач рассмотрим известную задачу динамики популяций, где рассматривается модель взаимодействия "жертв" и "хищников", в которой учитывается уменьшение численности представителей одной стороны с ростом численности другой. Модель была создана для биологических систем, но с определенными корректурами применима к конкуренции фирм, строительству финансовых пирамид, росту народонаселения, экологической проблематике и др.

Эта модель Вольтерра-Лотка с логистической поправкой описывается системой уравнений


с условиями заданной численности "жертв" и "хищников" в начальный момент t=0.

Решая эту задачу при различных значениях a, получаем различные фазовые портреты (обычный колебательный процесс и постепенная гибель популяций) .

		function f=VolterraLog(t,x)
		a=4;
		b=2.5;
		c=2;
		d=1;
		alpha=0.1;
		f(1)= (a-b*x(2))*x(1)-alpha*x(1)^2;
		f(2)= (-c+d*x(1))*x(2)-alpha*x(2)^2;
		f=f';
>>opt=odeset('OutputSel',[1 2], 'OutputFcn', 'odephas2');
>> [T,X]=ode45('VolterraLog', [0 10],[3 1],opt );
Рис.8.8
Рис.8.8 (a =0)
Рис.8.9
Рис.8.9 (a =0.1)

Имеется возможность построения и трехмерного фазового портрета с помощью функции odephas3. Например, решение задачи Эйлера свободного движения твердого тела:

=x2x3,  =-x1x3,  =-0.51Чx1x2

выступает в виде:

		function f=Eiler(t,x)
 		f(1)=  x(2)*x(3);
 		f(2)=  -x(1)*x(3) ;
 		f(3)=  -0.51*x(1)*x(2) ;
 		f=f';
>> opt=odeset('OutputSel',[1 2 3], 'OutputFcn', 'odephas3');
>> [T,X]=ode45('Eiler', [0 7.25], [0 0 1], opt ); %рис.8.10
>> [T,X]=ode45('Eiler', [0:0.25:7.25],[0 1 1]);
>> plot(T,X) % рис.8.11
Рис.8.10
Рис.8.10.
Рис.8.11
Рис.8.11.

<<<предыдущая глава к содержанию следующая глава >>>